// const Promise = require('./src/4.promise.js');

// Promise.resolve().then(() => {
//     console.log(0);
//     return Promise.resolve(4);
// }).then((res) => {
//     console.log(res)
// })

// Promise.resolve().then(() => {
//     console.log(1);
// }).then(() => {
//     console.log(2);
// }).then(() => {
//     console.log(3);
// }).then(() => {
//     console.log(5);
// }).then(() =>{
//     console.log(6);
// })

// Promise.resolve() 方法
// Promise.resolve('ok').then((data) => {
//     console.log('成功', data); // 成功 ok 
// })

// // Promise.reject() 方法
// Promise.reject(new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('ok');
//     }, 1000);
// })).then((data) => {
//     console.log('成功', data);
// }, err => {
//     console.log('err', err); // err
// })

// // catch
// Promise.reject(new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('ok');
//     }, 1000);
// })).then((data) => {
//     console.log('成功', data);
// }).catch(err => {
//     console.log('err', err); // err
// })


// Promise.all
// Promise.all = function(promises) {
//     return new Promise((resolve, reject) => {
//         let result = [];
//         let times = 0;

//         const processSuccess = (index, val) => {
//             result[index] = val;
//             if (++times === promises.length) {
//                 resolve(result);
//             }
//         }

//         for (let i = 0; i < promises.length; i++) {
//             let p = promises[i];
//             if (p && typeof p.then === 'function') {
//                 p.then((data) => {
//                     processSuccess(i, data);
//                 }, reject);
//             } else {
//                 processSuccess(i, p);
//             }
//         }
//     })
// }
// Promise.all([1, 2, 3, new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('ok');
//     }, 2000)
// })]).then((data) => {
//     console.log('成功', data); // 成功 [1, 2, 3, 'ok']
// }).catch(e => {
//     console.log('失败', e);
// })

// Promise.allSettled
// Promise.allSettled = function(promises) {
//     return new Promise((resolve, reject) => {
//         let result = [];
//         let times = 0;

//         const processSuccess = (index, val) => {
//             result[index] = val;
//             if (++times === promises.length) {
//                 resolve(result);
//             }
//         }

//         for (let i = 0; i < promises.length; i++) {
//             let p = promises[i];
//             if (p && typeof p.then === 'function') {
//                 p.then((data) => {
//                     processSuccess(i, { status: 'fulfilled', value: data });
//                 }).catch((err) => {
//                     processSuccess(i, { status: 'rejected', reason: err });
//                 })
//             } else {
//                 processSuccess(i, p);
//             }
//         }
//     })
// }
// Promise.allSettled([1, 2, 3, new Promise((resolve, reject) => {
//     setTimeout(() => {
//         reject('错误');
//     }, 2000)
// })]).then((data) => {
//     console.log('成功', data); // 成功 [ 1, 2, 3, { status: 'rejected', reason: '错误' } ]
// }).catch(e => {
//     console.log('失败', e);
// })

// promise.race
// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功')
//     }, 1000)
// })
// let p2 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         reject('失败')
//     }, 2000)
// })

// Promise.race = function(promises) {
//     return new Promise((resolve, reject) => {
//         for (let i = 0; i< promises.length; i++) {
//             let p = promises[i];
//             if (p && typeof p.then === 'function') {
//                 p.then(resolve, reject)
//             } else {
//                 resolve(p)
//             }
//         }
//     })
// }
// Promise.race([p1, p2]).then((data) => {
//     console.log(data);
// }, (err) => {
//     console.log(err);
// })

// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功')
//     }, 1000)
// })
// let p2 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         reject('失败')
//     }, 2000)
// })

// Promise.any = function(promises) {
//     return new Promise((resolve, reject) => {
//         let result = [];
//         let times = 0;

//         const processSuccess = (index, val) => {
//             result[index] = val;
//             if (++times === promises.length) {
//                 reject(result);
//             }
//         }

//         for (let i = 0; i < promises.length; i++) {
//             let p = promises[i];
//             if (p && typeof p.then === 'function') {
//                 p.then((data) => {
//                     resolve(data);
//                 }).catch(err => {
//                     processSuccess(i, err)
//                 });
//             } else {
//                 resolve(p);
//             }
//         }
//     })
// }
// Promise.any([p1, p2]).then((data) => {
//     console.log(data); // 成功
// }, (err) => {
//     console.log(err);
// })

// promise.race的使用场景：图片加载超时，请求超时
// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功')
//     }, 2000)
// })
// function wrap(p1) {
//     let abort;
//     let p = new Promise((resolve, reject) => {
//         abort = reject;
//     });
//     let p2 = Promise.race([p, p1]);
//     p2.abort = abort;
//     return p2;
// }
// let p2 = wrap(p1);
// p2.then((data) => {
//     console.log(data);
// }, (err) => {
//     console.log(err);
// });

// setTimeout(() => {
//     p2.abort('超过1s了');
// }, 1000);


// promise.finally

// Promise.prototype.finally = function(cb) {
//     // then是为了等待里层promise执行完
//     return this.then((data) => {
//         // Promise.resolve实现等待效果，等待cb执行完，然后将excutor中的值传递下去
//         return Promise.resolve(cb()).then((n) => data); // Promise.resolve保证promise执行完毕
//     }, (err) => {
//         return Promise.resolve(cb()).then((n) => { throw err });
//     })
// }

// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功')
//         // reject('失败')
//     }, 3000);
// }).finally((data) => {
//     console.log('finally', data); // finally undefined => finally接受不到参数，但是可以把resolve的返回值透传下去
// }).then((data) => {
//     console.log('resolve', data); // resolve  成功
// }).catch((data) => {
//     console.log('reject', data);  // reject  失败
// })

// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         resolve('成功')
//         // reject('失败')
//     }, 3000);
// }).finally((data) => {
//     console.log('finally', data); // finally undefined 
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('xxx');
//             // reject('yyy')
//         }, 2000);
//     })
// }).then((data) => {
//     console.log('resolve', data); // resolve  成功
// }).catch((data) => {
//     console.log('reject', data);  // reject  yyy
// })


// promisify
function promisify(readFile) {
    return function (...args) {
        return new Promise((resolve, reject) => {
            readFile(...args, (err, data) => {
                if (err) reject(err);
                resolve(data);
            })
        })
    }
}

// const fs = require('fs');
// let readFile = promisify(fs.readFile);

// readFile('./.gitignore', 'utf8').then((data) => {
//     console.log(data);
// })

function promisifyAll(obj) {
    let o = {};
    for (let key in obj) {
        if (typeof obj[key] === 'function') {
            o[key+'Promise'] = promisify(obj[key])
        }
    }
    return o;
}
const fs = require('fs');
let newFs = promisifyAll(fs);
newFs.readFilePromise('./.gitignore', 'utf8').then((data) => {
    console.log(data);
})

